home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’96 / PredatorPrey / AEvent.c < prev    next >
Text File  |  1996-06-22  |  7KB  |  263 lines

  1. /* AEvent.c */
  2.  
  3. #include <Types.h>
  4. #include <Quickdraw.h>
  5. #include <Controls.h>
  6. #include <Dialogs.h>
  7. #include <Events.h>
  8. #include <Files.h>
  9. /*#include <Lists.h>*/
  10. #include <Menus.h>
  11. #include <TextEdit.h>
  12. #include <AppleEvents.h>
  13.  
  14. #ifndef __GLO__
  15. #include "Globals.h"
  16. #endif
  17. #ifndef __RED__
  18. #include "ResourceDefs.h"
  19. #endif
  20. #ifndef __MIS__    
  21. #include "Miscellany.h"    
  22. #endif
  23. #ifndef __FIM__
  24. #include "FileM.h"
  25. #endif
  26. #ifndef __AEV__
  27. #include "AEvent.h"    
  28. #endif
  29. #define jcu    TRUE
  30.  
  31. /*void    AEvent_seg() {}*/
  32.  
  33. #pragma segment AEvent
  34.  
  35.  
  36.  
  37. /*----------*/
  38. void    InitializeAE ()        /*    C14    */
  39. {
  40.     OSErr            errCode;
  41.     
  42. /*    /* install the required apple event handlers »*/
  43. /*    AEEventHandlerUPP OPENae, QUITae, STARTae, PRINTae;*/
  44. /**/
  45. /*    /* must use these for PPC proc pointers »*/
  46. /*    OPENae = NewAEEventHandlerProc ((ProcPtr) &openAE);*/
  47. /*    QUITae = NewAEEventHandlerProc ((ProcPtr) &quitAE);*/
  48. /*    STARTae = NewAEEventHandlerProc ((ProcPtr) &startAE);*/
  49. /*    PRINTae = NewAEEventHandlerProc ((ProcPtr) &printAE);*/
  50. /**/
  51. /*    err = AEInstallEventHandler (kCoreEventClass, kAEOpenDocuments,*/
  52. /*        OPENae, 0, FALSE);*/
  53. /*    if (err) died ("Error Installing OpenDoc Apple Event", err, 9);*/
  54. /*    */
  55. /*    err = AEInstallEventHandler (kCoreEventClass, kAEQuitApplication,*/
  56. /*        QUITae, 0, FALSE);*/
  57. /*    if (err) died ("Error Installing QuitApp Apple Event", err, 10);*/
  58. /*    */
  59. /*    err = AEInstallEventHandler (kCoreEventClass, kAEOpenApplication,*/
  60. /*        STARTae, 0, FALSE);*/
  61. /*    if (err) died ("Error Installing OpenApp Apple Event", err, 11);*/
  62. /*    */
  63. /*    err = AEInstallEventHandler (kCoreEventClass, kAEPrintDocuments,*/
  64. /*        PRINTae, 0, FALSE);*/
  65. /*    if (err) died ("Error Installing PrintDoc Apple Event", err, 12);*/
  66.  
  67.  
  68.  
  69.     errCode = AEInstallEventHandler (kCoreEventClass, kAEOpenApplication, NewAEEventHandlerProc(DoAEOpenApp), 0L, false);
  70.     errCode = AEInstallEventHandler (kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerProc(DoAEOpenDoc), 0L, false);
  71.     errCode = AEInstallEventHandler (kCoreEventClass, kAEPrintDocuments, NewAEEventHandlerProc(DoAEPrintDoc), 0L, false);
  72.     errCode = AEInstallEventHandler (kCoreEventClass, kAEQuitApplication, NewAEEventHandlerProc(DoAEQuit), 0L, false);
  73.  
  74. } /*InitializeAE*/
  75.  
  76. /*----------*/
  77.  
  78.  
  79. #ifdef jcu
  80.     void    DoHighLevelEvent (EventRecord *theEvent)
  81. #else
  82.     void    DoHighLevelEvent (void)
  83. #endif
  84. {
  85.     OSErr            errCode;
  86.  
  87. /*  check to see if the Apple event is of a user-defined class;  */
  88. /*  if so, handle it. Otherwise, call AEProcessAppleEvent.        */
  89.  
  90. #ifdef jcu
  91.     errCode = AEProcessAppleEvent (theEvent);
  92. #else    
  93.     errCode = AEProcessAppleEvent (&curEvent);
  94. #endif    
  95.     if (errCode == errAEEventNotHandled) {
  96. /*??        Acknowledge (CantHandleAEVTID);        ??*/
  97.     }
  98.  
  99. } /*DoHighLevelEvent*/
  100.  
  101. /*----------*/
  102. /* This routine checks to verify that the caller has processed */
  103. /* all of the event's parameters. If no parameters are found */
  104. /* then it returns noErr. */
  105. /*----------*/
  106. OSErr    MyGotRequiredParams    (const AppleEvent        *theEvent)
  107. {
  108.     OSErr            errCode;
  109.     Size            actualSize;
  110.     DescType        returnedType;
  111.  
  112.     errCode = AEGetAttributePtr (theEvent, keyMissedKeywordAttr, typeWildCard,
  113.                                     &returnedType, NULL, 0, &actualSize);
  114.  
  115.     if (errCode == errAEDescNotFound) {        /*no parameters => no error*/
  116.         errCode = noErr;
  117.     } else if (errCode == noErr) {            /*got a parameter => it wasn't handled*/
  118.         errCode = errAEEventNotHandled;
  119.     }                                        /*AEGetAttributePtr failed*/
  120.  
  121.     return (errCode);
  122. } /*MyGotRequiredParams*/
  123.  
  124. /*----------*/
  125. pascal OSErr    DoAEOpenApp        (AppleEvent        *theEvent,
  126.                                  AppleEvent        *reply,
  127.                                  long            refCon)
  128. {
  129. #pragma unused (reply)
  130. #pragma unused (refCon)
  131.  
  132.     OSErr            errCode;
  133.  
  134.     errCode = MyGotRequiredParams (theEvent);
  135.     if (errCode == noErr) {
  136.         OpenApp ();
  137.     }
  138.  
  139.     return (errCode);
  140. } /*DoAEOpenApp*/
  141.  
  142. #if !defined(applec) /* MPW C */ && !defined(THINK_C)    /* AUX */
  143. /*----------*/
  144. /* Need to use PBOpenWD here instead of OpenWD because of an AUX 3.0 bug which omitted */
  145. /* the glue for OpenWD, resulting in a link error if OpenWD is used. */
  146. /*----------*/
  147. static OSErr AUXOpenWD            (short            vRefNum,
  148.                                  long            dirID,
  149.                                  long            procID,
  150.                                  short            *wdRefNum)
  151. {
  152.     WDPBRec            wdOpenRec;
  153.     OSErr            errCode;
  154.     short            i;
  155.     Ptr                p;
  156.  
  157. /* Need to use a local WDPBRec here and clear it out ourselves (instead of using a WDPBPtr */
  158. /* and NewPtrClear) because of an AUX 3.0 bug which omitted the glue for NewPtrClear, */
  159. /* resulting in a link error if NewPtrClear is used. */
  160.     for (i = 0, p = (Ptr) &wdOpenRec; i < sizeof (WDPBRec); i++, p++) {
  161.         *p = 0;            /* clear out wdOpenRec */
  162.     }
  163.     wdOpenRec.ioVRefNum  = vRefNum;
  164.     wdOpenRec.ioWDProcID = procID;
  165.     wdOpenRec.ioWDDirID  = dirID;
  166.     errCode = PBOpenWD (&wdOpenRec, false);
  167.     if (errCode == noErr) {
  168.         *wdRefNum = wdOpenRec.ioVRefNum;
  169.     }
  170.  
  171.     return (errCode);
  172. } /*AUXOpenWD*/
  173. #endif /* AUX */
  174.  
  175. /*----------*/
  176. pascal OSErr    DoAEOpenDoc        (AppleEvent        *theEvent,
  177.                                  AppleEvent        *reply,
  178.                                  long            refCon)
  179. {
  180. #pragma unused (reply)
  181. #pragma unused (refCon)
  182.  
  183.     OSErr            errCode;
  184.     OSErr            ignoreErr;
  185.     AEDescList        docList;
  186.     long            itemsInList;
  187.     long            index;
  188.     AEKeyword        keyword;
  189.     DescType        returnedType;
  190.     Size            actualSize;
  191.     FSSpec            myFSS;
  192.     short            wdRefNum;
  193.  
  194.     errCode = AEGetParamDesc (theEvent, keyDirectObject, typeAEList, &docList);
  195.     if (errCode == noErr) {
  196.         errCode = MyGotRequiredParams (theEvent);
  197.         if (errCode == noErr) {
  198.             errCode = AECountItems (&docList, &itemsInList);
  199.             if (errCode == noErr) {
  200.                 for (index = 1; index <= itemsInList; index++) {
  201.                     errCode = AEGetNthPtr (&docList, index, typeFSS, &keyword,
  202.                             &returnedType, (Ptr) &myFSS, sizeof (myFSS), &actualSize);
  203.                     if (errCode == noErr) {
  204. #if defined(applec) /* MPW C */ || defined(THINK_C)
  205.                         errCode = OpenWD (myFSS.vRefNum, myFSS.parID, 0L /* procID */, &wdRefNum);
  206. #else    /* AUX */
  207.                         errCode = AUXOpenWD (myFSS.vRefNum, myFSS.parID, 0L /* procID */, &wdRefNum);
  208. #endif
  209.                         if (errCode == noErr) {
  210.                             OpenDoc (myFSS.name, wdRefNum);
  211.                         }
  212.                     }
  213.                 } /*for*/
  214.             }
  215.         }
  216.         ignoreErr = AEDisposeDesc (&docList);
  217.     }
  218.  
  219.     return (errCode);
  220. } /*DoAEOpenDoc*/
  221.  
  222. /*----------*/
  223. pascal OSErr    DoAEPrintDoc    (AppleEvent        *theEvent,
  224.                                  AppleEvent        *reply,
  225.                                  long            refCon)
  226. {
  227. #pragma unused (reply)
  228. #pragma unused (refCon)
  229.  
  230.     OSErr            errCode;
  231.  
  232.     errCode = MyGotRequiredParams (theEvent);
  233.     if (errCode == noErr) {
  234. /*??        Acknowledge (CantPrintID);    ??*/    ;
  235.     }
  236.  
  237.     return (errCode);
  238. } /*DoAEPrintDoc*/
  239.  
  240. /*----------*/
  241. pascal OSErr    DoAEQuit        (AppleEvent        *theEvent,
  242.                                  AppleEvent        *reply,
  243.                                  long            refCon)
  244. {
  245. #pragma unused (reply)
  246. #pragma unused (refCon)
  247.  
  248.     OSErr            errCode;
  249.  
  250.     errCode = MyGotRequiredParams (theEvent);
  251.     if (errCode == noErr) {
  252.         DoQuit ();
  253.     }
  254.  
  255.     return (errCode);
  256. } /*DoAEQuit*/
  257.  
  258. /*----------*/
  259. /* Add an InteractWithUser as an example of how it is done.*/
  260. /*    Include an IdleProc which updates windows in the background.*/
  261.  
  262. /*AEvent*/
  263.